package com.lyk.coursearrange.util;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.lyk.coursearrange.entity.Distribute;
import com.lyk.coursearrange.service.DistributeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DistributeUtil {

    @Autowired
    private DistributeService distributeService;

    /**
     * 配置使用方法
     * DistributeNo：默认使用1
     * DistributeRule：根据想分配的数目+1,比如：想每个人分配1个后，换下一个，库里要配置2
     * @param distributeType
     * @return
     */
    public String GetDistributeAdmin(Long distributeType){
        String adminNo="";
        LambdaQueryWrapper<Distribute> wrapper = new LambdaQueryWrapper();
        wrapper.eq(Distribute::getDistributeType,distributeType);
        wrapper.orderByAsc(Distribute::getAdminNo);
        List<Distribute> list = distributeService.list(wrapper);
        if (list.isEmpty()){
            return "";
        }

        boolean flag=false;
        //已分配的个数与规则进行整除，能正除开，向下继续，不能整除开，直接将admin_no的order_number+1,同时将该账号加到下边的账号里
        for (Distribute distributeAttr : list) {
            //当前已分配的个数与要分配的个数是否能整除
            long remain = distributeAttr.getDistributeNo() % distributeAttr.getDistributeRule();
            //如果能整除，分配下一个
            if (remain==0L&&(!distributeAttr.getDistributeNo().equals(0))){
                continue;
            }else {
                //取到对应admin，分配个数对应加一，然后退出
                adminNo=distributeAttr.getAdminNo();
                distributeAttr.setDistributeNo(distributeAttr.getDistributeNo()+1);
                distributeService.updateById(distributeAttr);
                flag=true;
                break;
            }
        }
        if (!flag){
            Distribute distributeAttr=list.get(0);
            adminNo=distributeAttr.getAdminNo();
            distributeAttr.setDistributeNo(distributeAttr.getDistributeNo()+1);
            distributeService.updateById(distributeAttr);
        }
        return adminNo;
    }

}
